package com.xj.algorithm.leetcode;

import java.util.Arrays;

/**
 * 合并两个有序数组
 */
public class L88_合并两个有序数组 {

    /**
     * 给定两个有序整数数组 nums1 和 nums2，将 nums2 合并到 nums1 中，使得 num1 成为一个有序数组。
     *
     * 说明:
     *
     * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
     * 你可以假设 nums1 有足够的空间（空间大小大于或等于 m + n）来保存 nums2 中的元素。
     * 示例:
     *
     * 输入:
     * nums1 = [1,2,3,0,0,0], m = 3
     * nums2 = [2,5,6],       n = 3
     *
     * 输出: [1,2,2,3,5,6]
     */
    public static void main(String[] args) {
        int[] nums1=new int[]{1,2,3,0,0,0};
        int m=3;
        int[] nums2=new int[]{2,5,6};
        int n=3;
        mergeOffice(nums1,m,nums2,n);
        for (int i=0;i<m+n;i++){
            System.out.print(nums1[i]);
            if(i!=m+n-1){
                System.out.print(",");
            }
        }
        System.out.println();

        int[] nums3=new int[]{0};
        int m3=0;
        int[] nums4=new int[]{1};
        int n4=1;
        mergeOffice(nums3,m3,nums4,n4);
        for (int i=0;i<m3+n4;i++){
            System.out.print(nums3[i]);
            if(i!=m3+n4-1){
                System.out.print(",");
            }
        }
        System.out.println();
    }

    //自己的解法：逆序比较，最大的先放在后面
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        while(m>0 && n>0){
            if(nums1[m-1]>nums2[n-1]){
                nums1[m+n-1]=nums1[m-1];
                m--;
            }else{
                nums1[m+n-1]=nums2[n-1];
                n--;
            }
        }
        while(n>0){
            nums1[m+n-1]=nums2[n-1];
            n--;
        }
    }

    //官方解法：
    public static void mergeOffice(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;
        while ((p1 >= 0) && (p2 >= 0)) {
            nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
        }
        System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
    }

    //精彩解法：合并和排序。利用已知api
    public static void mergeGood(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2, 0, nums1, m, n);
        Arrays.sort(nums1);
    }
}
